package com.xk.ucs.modbus.handler;


import cn.hutool.core.lang.Pair;
import com.xk.ucs.modbus.pojo.LightControlMode;

import java.util.Map;

/**
 * Date:2021/1/1 Author：01398017 Description: modbus操作类
 **/

public interface ModbusHandler {

	/**
	 * 进入后台时，要实时展示下位机状态，直接展示中文
	 *
	 * @return 0：初始化状态   1：停止状态   2：手动状态   4：自动状态    5：报警状态 字典表中维护
	 */
	Pair<Integer, String> readSystemStatus();

	/**
	 * 重要告警0：急停报警 1：X伺服报警 2：Z伺服报警 3：安全门报警 后续字典表里可配 告警可能同时有多组
	 *
	 * @return key-->bit位  0-7 可作为告警的code value->告警中文
	 */
	Map<Integer, String> readWarning();


	/**
	 * 触发取货操作 x：  货道号 1-99 从左到右依次为1-99 y： 第几排1-4 从下到上1-4排 不会等待取货完成，只是向下位机发送指令，取货结果
	 *
	 * @return
	 *
	 * @see ModbusHandler.getGoodsOutResult
	 */
	boolean triggerGoodsOut(int x, int y);

	/**
	 * 获取取货结果，内部会阻塞，最多2分钟 x：  货道号 1-99 从左到右依次为1-99 y： 第几排1-4 从下到上1-4排
	 * @see MODBUS_PICKUP_STATUS_TIME_OUT MODBUS_PICKUP_STATUS_SUCCESS MODBUS_PICKUP_STATUS_FAILURE
	 * @return
     * SUCCESS：取货成功  FAILURE：取货失败  TIMEOUT ：取货超时
	 */
	String getGoodsOutResult(int x, int y);

	/**
	 * 货道扫描 数组长度代表排数，例如 长度是5，则表示有5排 从下到上1-5排，，内部会阻塞，最多2min 例如：返回值是 [20,30 ,40 ,50,60]，表示从下到上分别1-5排是20列、30列、40列、50列、60列
	 *
	 * @return
	 */
	int[] scanChannels();

	/**
	 * 灯光控制，值只能是字典表中light_control_mode对应的code
	 *
	 * @param
	 * @param lightControlMode
	 *
	 * @return
	 */
	boolean writeLightControlMode(LightControlMode lightControlMode);

	/**
	 * * 控制灯光， lightControlMode中的mode应当从DicCache字典中取light_control_mode type作为key和描述
	 * 前端在展示灯光控制的可选项时也应从DicCache中取light_control_mode type作为key和描，便于后续增加
	 *
	 * @return
	 */
	LightControlMode readLightControlMode();

	/**
	 * 故障检测，
	 *
	 * @return key--取DicCache字典表中 check_bug_type 对应的 code，value-故障文
	 */
	Map<Integer, String> checkBug();

	/**
	 * 检测门是否打开，门打开需要页面自动跳转到后台登录页面 该方法应该定时由前端调用，比如3scheck一次 如果门打开，则返回true，否则返回false
	 *
	 * @return true表示开门
	 */
	boolean checkDoorOpened();

	/**
	 * 用于用户取货后的弹框确认，确认后取货口闸门会关闭
	 * @return
	 */
	boolean confirmPickUp();

	/**
	 * 下位机写入值
	 * @param position  地址
	 * @param value 值
	 * @return
	 */
	boolean writeValue(int position,int value);

	/**
	 * 开始退货门打开
	 * @return
	 */
	boolean startRefund();

	/**
	 * 退货结束门关闭
	 * @return
	 */
	boolean endRefund();

	/**
	 *
	 * @return
	 */
	boolean refundStatus();
}
